'use strict';

const Controller = require('egg').Controller;
/**
 * @controller adminGiftController 礼物管理-后台管理
 */
class GiftController extends Controller {

    /**  
     * @summary 渲染用户列表
     * @description 渲染用户列表
     * @router get /admin/gift 
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async index() {
        // 结构
        let {
            ctx,
            app
        } = this
        // 查询
        let data = await ctx.page('Gift')
        // 渲染并返回数据
        await ctx.renderTemplate({
            data: data,
            title: '礼物列表',
            tempType: 'table',
            table: {
                buttons: {
                    add: '/admin/gift/create'
                },
                columns: [{
                        title: '礼物',
                        fixed: 'left',
                        render(item) {
                            let index = item.image.indexOf('jpg')
                            let image = index !== -1 ? item.image : '/public/assets/img/profiles/avatar-01.jpg'
                            return `
                        <h2 class="table-avatar">
                            <a class="avatar avatar-sm mr-2"><img class="avatar-img rounded-circle bg-light" src="${image}"></a>
                        </h2>`
                        },
                    },
                    {
                        title: '名称',
                        key: 'name',
                        fixed: 'center'
                    },
                    {
                        title: '金币',
                        key: 'coin',
                        fixed: 'center'
                    },
                    {
                        title: '创建时间',
                        key: 'created_time',
                        fixed: 'center',
                        width: 200
                    },
                    {
                        title: "操作",
                        width: 200,
                        fixed: 'center',
                        action: {
                            edit: function (id) {
                                return `/admin/gift/edit/${id}`
                            },
                            delete: function (id) {
                                return `/admin/gift/delete/${id}`
                            },
                        }
                    }
                ]
            }
        })
    }


    /**  
     * @summary 渲染创建礼物
     * @description 渲染创建礼物
     * @router get /admin/gift/create 
     * @request get 这里不需要参数
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async create() {
        const {
            ctx,
            app
        } = this;
        // 渲染公共模板
        await ctx.renderTemplate({
            // 页面标题
            title: "创建礼物",
            // 模板类型 form表单，table表格分页
            tempType: "form",
            // 表单配置
            form: {
                // 提交地址
                action: "/admin/gift/save",
                // 字段配置
                fields: [{
                    label: "礼物名称",
                    type: "text",
                    name: "name",
                    placeholder: "礼物名称"
                }, {
                    label: "礼物图标",
                    type: "file",
                    name: "image",
                    placeholder: "礼物图标"
                }, {
                    label: "金币",
                    type: "number",
                    name: "coin",
                    placeholder: "金币"
                }]
            },
            // 新增成功跳转路径
            successUrl: "/admin/gift"
        })
    }
    /**  
     * @summary 创建礼物
     * @description 创建礼物
     * @router post /admin/gift/save 
     * * @request name string *name  xxxx
     * * @request image string image xxxx
     * * @request coin string coin xxxx
     * @response 200 user 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    // 新增逻辑
    async save() {
        // 结构
        let {
            app,
            ctx
        } = this;

        // 参数验证
        ctx.validate({
            name: {
                type: 'string',
                required: true,
                desc: '管理员账户'
            },
            image: {
                type: 'string',
                required: false,
                desc: '管理员密码'
            },
            coin: {
                type: 'int',
                required: false,
                desc: '金币',
                defValue: 0
            }
        })
        // 获取参数
        let {
            name,
            image,
            coin
        } = ctx.request.body

        /* 创建用户 */
        let gift = await app.model.Gift.create({
            name,
            image,
            coin
        })
        // ctx.apiSuccess(manager)
        ctx.toast('添加成功', 'success')
        // 重定向页面
        ctx.redirect('/admin/gift')
    }

    /**  
     * @summary 渲染修改礼物页面
     * @description 渲染修改礼物页面
     * @router get /admin/gift/edit/:id 
     * * @request id string *id xxx
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async edit() {
        // 结构
        let {
            app,
            ctx
        } = this
        // 参数验证
        ctx.validate({
            id: {
                type: 'string',
                required: true,
                desc: '礼物ID'
            }
        })
        // 获取参数
        let id = ctx.params.id
        // 判断管理员是否存在
        let data = await app.model.Gift.findOne({
            where: {
                id
            }
        })
        // 不存在-渲染404页面
        if (!data) {
            return await ctx.pageFail('该记录不存在')
        }
        // 存在-渲染表单页面
        data = JSON.parse(JSON.stringify(data))
        await ctx.renderTemplate({
            id,
            title: '修改礼物',
            tempType: 'form',
            form: {
                action: '/admin/gift/update/' + id,
                // 字段配置
                fields: [{
                    label: "礼物名称",
                    type: "text",
                    name: "name",
                    placeholder: "礼物名称"
                }, {
                    label: "礼物图标",
                    type: "file",
                    name: "image",
                    placeholder: "礼物图标"
                }, {
                    label: "金币",
                    type: "number",
                    name: "coin",
                    placeholder: "金币"
                }],
                data
            },
            // 新增成功跳转路径
            successUrl: "/admin/gift"
        })
    }

    /**  
     * @summary 更新礼物信息
     * @description 更新礼物信息
     * @router post /admin/gift/update/:id 
     * * @request id string *id xxx
     * * @request name string *name xxx
     * * @request image string image xxx
     * * @request icon string icon xxx
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async update() {
        // 结构
        let {
            app,
            ctx
        } = this
        // 参数验证
        ctx.validate({
            id: {
                type: 'int',
                required: true,
                desc: '礼物ID'
            },
            name: {
                type: 'string',
                required: true,
                desc: '礼物名称'
            },
            image: {
                type: 'string',
                required: false,
                desc: '礼物照片'
            },
            coin: {
                type: 'int',
                required: false,
                desc: '金币',
                defValue: 0
            }
        })
        // 获取参数
        let id = ctx.params.id
        let {
            name,
            image,
            coin
        } = ctx.request.body
        // 查询用户是否存在
        let gift = await app.model.Gift.findOne({
            where: {
                id
            }
        })
        if (!gift) {
            return ctx.apiFail('礼物不存在')
        }
        // 查询用户名是否唯一 用到[Op.ne] 不等于
        let Op = app.Sequelize.Op
        if (await app.model.Gift.findOne({
                where: {
                    name,
                    id: {
                        [Op.ne]: id
                    }
                }
            })) {
            return ctx.apiFail('礼物已存在')
        }
        // 如果密码存在--赋值密码
        gift.name = name
        gift.image = image
        gift.coin = coin
        // 返回成功的提示
        ctx.apiSuccess(await gift.save())
    }

    /**  
     * @summary 根据ID删除礼物
     * @description 根据ID删除礼物
     * * @request id string *id xxx/id
     * @router get /admin/gift/delete/:id 
     * @response 200 data 返回结果。（ 对应 contract 里面的验证属性，下面会提到 。）
     */
    async delete() {
        // 结构
        let {
            ctx,
            app
        } = this
        // 获得参数
        ctx.validate({
            id: {
                type: 'int',
                required: true,
                desc: '用户ID'
            }
        })
        // 删除数据
        let id = ctx.params.id
        // 添加cookie
        await app.model.Gift.destroy({
            where: {
                id
            }
        })
        ctx.toast('删除成功', 'success')
        // 重定向页面
        ctx.redirect('/admin/gift')
    }
}

module.exports = GiftController;